commonlibsse_ng\re\e/
ExtraEncounterZone.rs

1use crate::re::BGSEncounterZone::BGSEncounterZone;
2use crate::re::BSExtraData::{BSExtraData, DerivedBSExtraData};
3use crate::re::ExtraDataType::ExtraDataType;
4use crate::re::offsets_rtti::RTTI_ExtraEncounterZone;
5use crate::re::offsets_vtable::VTABLE_ExtraEncounterZone;
6use crate::rel::id::VariantID;
7
8/// Represents extra data for encounter zones.
9///
10/// Inherits from `BSExtraData` and includes a pointer to a `BGSEncounterZone`.
11///
12/// # Memory Layout:
13/// - `__base`: Base class `BSExtraData`
14/// - `zone`: Pointer to `BGSEncounterZone` (0x10)
15/// - `pad`: Padding to align with C++ structure (0x18)
16#[repr(C)]
17pub struct ExtraEncounterZone {
18    /// Base class `BSExtraData`.
19    pub __base: BSExtraData,
20
21    /// Pointer to `BGSEncounterZone`.
22    /// Offset: `0x10`
23    pub zone: *mut BGSEncounterZone,
24}
25
26const _: () = {
27    assert!(core::mem::offset_of!(ExtraEncounterZone, __base) == 0x0);
28    assert!(core::mem::offset_of!(ExtraEncounterZone, zone) == 0x10);
29    assert!(core::mem::size_of::<ExtraEncounterZone>() == 0x18);
30};
31
32impl Default for ExtraEncounterZone {
33    #[inline]
34    fn default() -> Self {
35        Self::new()
36    }
37}
38
39impl DerivedBSExtraData for ExtraEncounterZone {
40    #[inline]
41    fn get_extra_data(&self) -> &BSExtraData {
42        &self.__base
43    }
44
45    #[inline]
46    fn get_extra_data_type() -> ExtraDataType {
47        Self::EXTRA_DATA_TYPE
48    }
49}
50
51impl ExtraEncounterZone {
52    /// Address & offset of the runtime type information (RTTI) identifier.
53    pub const RTTI: VariantID = RTTI_ExtraEncounterZone;
54
55    /// Address & offset of the virtual function table.
56    pub const VTABLE: [VariantID; 1] = VTABLE_ExtraEncounterZone;
57
58    /// The `ExtraDataType` value for encounter zones.
59    pub const EXTRA_DATA_TYPE: ExtraDataType = ExtraDataType::EncounterZone;
60
61    /// Creates a new `ExtraEncounterZone` instance with no zone (nullptr).
62    #[inline]
63    pub const fn new() -> Self {
64        Self { __base: BSExtraData::new(), zone: std::ptr::null_mut() }
65    }
66
67    /// Creates a new `ExtraEncounterZone` instance with a specified zone.
68    #[inline]
69    pub const fn from_zone(zone: *mut BGSEncounterZone) -> Self {
70        Self { __base: BSExtraData::new(), zone }
71    }
72
73    /// Retrieves the extra data type, always returning `ExtraDataType::EncounterZone`.
74    #[inline]
75    pub const fn get_type(&self) -> ExtraDataType {
76        ExtraDataType::EncounterZone
77    }
78
79    /// Checks if this `ExtraEncounterZone` is not equal to another.
80    #[inline]
81    pub fn is_not_equal(&self, rhs: &Self) -> bool {
82        self.zone != rhs.zone
83    }
84}
85
86/// The virtual function table for `ExtraEncounterZone`.
87///
88/// This struct defines function pointers to simulate the C++ virtual functions.
89#[repr(C)]
90pub struct ExtraEncounterZoneVtbl {
91    /// Destructor function pointer.
92    pub CxxDrop: fn(this: &mut ExtraEncounterZone),
93
94    /// Function pointer for retrieving the extra data type.
95    pub GetType: fn(this: &ExtraEncounterZone) -> ExtraDataType,
96
97    /// Function pointer for equality check.
98    pub IsNotEqual: fn(this: &ExtraEncounterZone, rhs: &ExtraEncounterZone) -> bool,
99}
100
101impl Default for ExtraEncounterZoneVtbl {
102    #[inline]
103    fn default() -> Self {
104        Self::new()
105    }
106}
107
108impl ExtraEncounterZoneVtbl {
109    /// Creates a new default virtual table with stubbed functions.
110    pub const fn new() -> Self {
111        const fn CxxDrop(_this: &mut ExtraEncounterZone) {}
112
113        const fn GetType(_this: &ExtraEncounterZone) -> ExtraDataType {
114            ExtraEncounterZone::EXTRA_DATA_TYPE
115        }
116
117        fn IsNotEqual(this: &ExtraEncounterZone, rhs: &ExtraEncounterZone) -> bool {
118            this.zone != rhs.zone
119        }
120
121        Self { CxxDrop, GetType, IsNotEqual }
122    }
123}